﻿Imports System.Web
Imports System.Web.Services
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO

Public Class hndImage
    Implements System.Web.IHttpHandler
    Private maxWidth As Integer = ConfigurationManager.AppSettings("maxPhotoWidth")
    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        'Try
        Dim photoPath As String = ConfigurationManager.AppSettings("photoPath")
        Dim retImage As String = context.Server.MapPath(photoPath & "nopicture.jpg")
        If Not String.IsNullOrEmpty(context.Request.QueryString("adID")) And _
            (Not String.IsNullOrEmpty(context.Request.QueryString("id")) Or _
                Not String.IsNullOrEmpty(context.Request.QueryString("filename"))) Then
            Dim XIDAnnuncio As New Guid(context.Request.QueryString("adID"))
            Dim XIDImmagine As Integer = 999
            Dim filename As String = context.Request.QueryString("filename")
            If Integer.TryParse(context.Request.QueryString("id"), XIDImmagine) Then
                'Lista delle immagini di un annuncio. Se l'annuncio non è ancora stato salvato nel DB, questa lista sarà vuota
                Dim immagine As AnnuncioImmagini = Nothing
                If XIDImmagine = 999 Then
                    Dim imgsList As List(Of AnnuncioImmagini) = (From i In DAL.Context.AnnuncioImmagini Where i.IDAnnuncio = XIDAnnuncio Order By i.Ordine).ToList
                    If imgsList.Count > 0 Then
                        immagine = imgsList.First
                        retImage = context.Server.MapPath(photoPath & XIDAnnuncio.ToString & "/" & immagine.Percorso)
                    End If
                Else
                    immagine = DAL.Context.AnnuncioImmagini.Where(Function(i) i.IDAnnuncio = XIDAnnuncio And i.IDImmagine = XIDImmagine).First
                    retImage = context.Server.MapPath(photoPath & XIDAnnuncio.ToString & "/" & immagine.Percorso)
                End If
            Else
                retImage = context.Server.MapPath(photoPath & XIDAnnuncio.ToString & "/" & filename)
            End If
            Dim image As Drawing.Image = Nothing
            If File.Exists(retImage) Then
                image = System.Drawing.Image.FromFile(retImage)
            Else
                retImage = context.Server.MapPath(photoPath & "nopicture.jpg")
                image = System.Drawing.Image.FromFile(retImage)
            End If
            'Se c'è da ridimensionare, lo facciamo. Altrimenti di default prendiamo le dimensioni effettive
            context.Response.ContentType = "image/jpeg"
            Dim width As Integer = image.Width
            Dim height As Integer = image.Height
            If Not String.IsNullOrEmpty(context.Request.QueryString("w")) Then
                Integer.TryParse(context.Request.QueryString("w"), width)
            End If
            If Not String.IsNullOrEmpty(context.Request.QueryString("h")) Then
                Integer.TryParse(context.Request.QueryString("h"), height)
            End If
            'RIDIMENSIONAMENTO, solo se una delle 2 dimensioni è stata specificata
            If width <> image.Width Or height <> image.Height Then
                ' se è specificata solo la larghezza, calcola l'altezza
                If height = image.Height Then
                    height = Convert.ToInt32(width / image.Width * image.Height)
                End If
                ' (e viceversa)
                If width = image.Width Then
                    width = Convert.ToInt32(height / image.Height * image.Width)
                End If
            End If
            'Se le dimensioni son rimaste originali, allora le gestiamo per apparire meglio su schermo
            If height = image.Height And width = image.Width Then
                If width > maxWidth Then
                    width = maxWidth
                    height = Convert.ToInt32(width / image.Width * image.Height)
                End If
            End If
            Dim thumb As New Bitmap(width, height)
            ' creo la Thumbnail con i parametri impostati
            'Dim miniaturabmp As New Bitmap(thumb, width, height)
            Dim g As Graphics = Graphics.FromImage(thumb)
            g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
            g.CompositingMode = Drawing2D.CompositingMode.SourceCopy
            g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
            g.DrawImage(image, 0, 0, width, height)
            Dim info As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
            Dim encoderparams As EncoderParameters = New EncoderParameters(1)
            encoderparams.Param(0) = New EncoderParameter(Encoder.Quality, 80L)
            ' salvo sullo stream di output
            thumb.Save(context.Response.OutputStream, info(1), encoderparams)
            ' pulizia
            thumb.Dispose()
            ' pulizia finale
            context.Response.End()
        End If
        'Catch ex As Exception
        '    context.Response.Write(String.Empty)
        'End Try
    End Sub
    ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property
End Class